import QtQuick
import QtQuick.Controls

Item {
    id: marquee
    // 基础配置属性
    property int scrollSpeed: 120      // 滚动速度（像素/秒）
    property color textColor: "red"    // 文本颜色
    property int textSize: 14          // 文本大小
    property color bgColor: "transparent"  // 背景色
    property int spacing: 30           // 报警项间距
    property int padding: 10           // 背景内边距

    // 背景宽高配置
    property real bgWidth: parent.width    // 背景宽度
    property real bgHeight: parent.height  // 背景高度

    // 5个报警信号（bool变量）
    property bool var1: false
    property bool var2: false
    property bool var3: false
    property bool var4: false
    property bool var5: false

    // 报警文本（可自定义）
    property string alarm1Text
    property string alarm2Text
    property string alarm3Text
    property string alarm4Text
    property string alarm5Text

    // 数据模型
    property ListModel alarmModel: ListModel {}

    // 背景容器
    Rectangle {
        id: background
        width: bgWidth
        height: bgHeight
        anchors.centerIn: parent
        color: bgColor
        radius: 4
        border.color: "#eee"
        border.width: 1
        z: 1

        onWidthChanged: if (alarmModel.count > 0) resetAndRestart()
        onHeightChanged: if (alarmModel.count > 0) resetAndRestart()
    }

    // 裁剪区域
    Rectangle {
        id: clipArea
        anchors.fill: background
        anchors.margins: padding
        color: "transparent"
        clip: true
        z: 1
    }

    // 滚动容器
    Row {
        id: scrollRow
        parent: clipArea
        anchors.verticalCenter: parent.verticalCenter
        height: parent.height
        spacing: 30

        Repeater {
            model: alarmModel
            Text {
                text: model.text
                color: textColor
                font.pixelSize: textSize
                verticalAlignment: Text.AlignVCenter
                height: parent.height
            }
        }
    }

    // 滚动动画
    NumberAnimation {
        id: scrollAnim
        target: scrollRow
        property: "x"
        running: false
    }

    // 监听动画的stopped信号（替代直接赋值onStopped，修复只读属性错误）
    Connections {
        target: scrollAnim
        function onStopped() {
            // 动画停止后，若仍有报警则继续循环
            if (alarmModel.count > 0) {
                scrollRow.x = clipArea.width + padding  // 复位到右侧起点
                loopAnimation()  // 启动下一次循环
            }
        }
    }

    // 单次滚动动画逻辑
    function loopAnimation() {
        if (alarmModel.count === 0) return

        // 计算内容总宽度和终点
        let contentWidth = 0
        for (let i = 0; i < scrollRow.children.length; i++) {
            contentWidth += scrollRow.children[i].width
        }
        const endX = -contentWidth - spacing

        // 配置并启动当前动画
        scrollAnim.from = scrollRow.x
        scrollAnim.to = endX
        scrollAnim.duration = (scrollRow.x - endX) / (scrollSpeed / 1000)
        scrollAnim.start()
    }

    // 复位并重启动画
    function resetAndRestart() {
        scrollAnim.stop()
        scrollRow.x = clipArea.width + padding  // 复位到右侧起点
        loopAnimation()  // 启动第一次循环
    }

    // 监听5个bool变量变化
    onVar1Changed: var1 ? addAlarm(alarm1Text) : removeAlarm(alarm1Text)
    onVar2Changed: var2 ? addAlarm(alarm2Text) : removeAlarm(alarm2Text)
    onVar3Changed: var3 ? addAlarm(alarm3Text) : removeAlarm(alarm3Text)
    onVar4Changed: var4 ? addAlarm(alarm4Text) : removeAlarm(alarm4Text)
    onVar5Changed: var5 ? addAlarm(alarm5Text) : removeAlarm(alarm5Text)

    // 监听模型变化
    Connections {
        target: alarmModel
        function onCountChanged() {
            if (alarmModel.count === 0) {
                scrollAnim.stop()
                scrollRow.x = clipArea.width + padding
            } else {
                Qt.callLater(resetAndRestart)
            }
        }
    }

    // 父控件尺寸变化适配
    onParentChanged: {
        if (parent) {
            if (bgWidth === marquee.parent.width) bgWidth = parent.width
            if (bgHeight === marquee.parent.height) bgHeight = parent.height
        }
    }

    // 内部添加/移除函数
    function addAlarm(text) {
        if (!text) return
        for (let i = 0; i < alarmModel.count; i++) {
            if (alarmModel.get(i).text === text) return
        }
        alarmModel.append({ text: text })
    }
    function removeAlarm(text) {
        for (let i = 0; i < alarmModel.count; i++) {
            if (alarmModel.get(i).text === text) {
                alarmModel.remove(i)
                return
            }
        }
    }
    function clearAll() {
        alarmModel.clear()
    }
}
